const axios = require('axios');

const url = 'http://example.com/mixeddatastream';

// 行分隔符
const LINE_SEPARATOR = '\n';

// 处理文本数据
async function handleTextData(response, options = { encoding: 'utf-8' }) {
    // 创建一个可读流
    const reader = response.data.getReader();

    // 定义一个变量存储文本数据
    let text = '';//此处，可能会导致内存溢出

    // 匹配所有行分隔符
    const LINE_SEPARATOR_REGEX = /\r\n|\r|\n/g;

    // 逐行读取文本数据
    while (true) {
        // 从可读流中读取数据
        const { done, value } = await reader.read();
        if (done) {
            // 所有数据已读取完成，输出文本数据
            console.log(text);
            return;
        }

        // 将数据转化为文本并追加到变量中
        const chunk = new TextDecoder(options.encoding).decode(value);
        text += chunk;

        // 如果数据中包含行分隔符，输出当前行的文本数据
        let match;
        while (match = LINE_SEPARATOR_REGEX.exec(text)) {
            const line = text.slice(0, match.index);
            text = text.slice(match.index + match[0].length);
            console.log(line);
        }
    }
}

const { Transform } = require('stream');

async function handleTextData2(response, options = { encoding: 'utf-8' }) {
  // 创建一个可读流
  const reader = response.data.getReader();

  // 创建一个 Transform 流，用于逐行读取数据
  const lineTransform = new Transform({
    readableObjectMode: true,
    transform(chunk, encoding, callback) {
      // 将数据转换为字符串并分割成行数据
      const lines = chunk.toString().split(/\r\n|\r|\n/g);

      // 将每行数据推送到下游流
      for (const line of lines) {
        if (line) {
          this.push(line);
        }
      }

      callback();
    }
  });

  // 将可读流连接到 Transform 流
  reader.pipeThrough(new TextDecoderStream(options.encoding)).pipe(lineTransform);

  // 输出每行数据
  for await (const line of lineTransform) {
    console.log(line);
  }
}

  

// 处理图片数据
function handleImageData(response) {
  // 创建一个图片元素
  const img = new Image();
  img.src = URL.createObjectURL(response.data);
  img.onload = () => {
    // 处理图片数据
    console.log(`图片宽度：${img.width}px，高度：${img.height}px`);
  };
}

axios.get(url, {
  responseType: 'blob'
}).then(response => {
  const contentType = response.headers['content-type'];
  if (contentType.startsWith('text')) {
    handleTextData(response);
  } else if (contentType.startsWith('image')) {
    handleImageData(response);
  } else {
    // 处理其他类型的数据
    console.log(`未知类型数据：${contentType}`);
  }
});
